﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace TOSCOMMCreate
{
    class ClsProtol
    {
        private readonly byte _start = 0xED;
        private readonly byte _datastart = 0xEF;
        private readonly byte _end = 0xEE;

        public enum Control2ValueInDataFrame
        {
            [Description("FC数据")]
            FC = 0x01,
            [Description("FC+Payload数据")]
            FCPayload,
            [Description("Payload数据")]
            Payload,
            [Description("发送完成")]
            发送完成,
            [Description("选择确认帧发送完成")]
            选择确认帧发送完成,
            [Description("RF和HPLC信道同时发送FC+Payload数据")]
            RF和HPLC信道同时发送FCPayload
        }

        public enum Control2ValueInControlFrame
        {
            [Description("复位命令 PC->HW")]
            复位命令=0x00,
            [Description("通讯测试（用于通信性能测试系统）PC->HW")]
            通讯测试 = 0x01,
            [Description("通讯测试确认 HW->PC")]
            通讯测试确认 = 0x02,
            [Description("读取硬件平台时间 PC->HW")]
            读取硬件平台时间 = 0x03,
            [Description("读取硬件平台时间回复 HW->PC")]
            读取硬件平台时间回复 = 0x04,
            [Description("设置回复选择确认帧的设备TEI列表 PC->HW")]
            设置回复选择确认帧的设备TEI列表 = 0x07,
            [Description("设备TEI列表设置确认 HW->PC")]
            设备TEI列表设置确认 = 0x08,
            [Description("频段模式配置 PC->HW")]
            频段模式配置 = 0x09,
            [Description("频段模式配置确认 HW->PC")]
            频段模式配置确认 = 0x0A,
            [Description("设置强制回复NACK的设备TEI列表 PC->HW")]
            设置强制回复NACK的设备TEI列表 = 0x0D,
            [Description("NACK设备TEI列表设置确认 HW->PC")]
            NACK设备TEI列表设置确认 = 0x0E,
            [Description("设置标准设备硬件填充CRC PC->HW")]
            设置标准设备硬件填充CRC = 0x15,
            [Description("设备标准设备硬件填充CRC成功 HW->PC")]
            设备标准设备硬件填充CRC成功 = 0x16,
            [Description("设置标准设备同步时钟与补偿频偏 PC->HW")]
            设置标准设备同步时钟与补偿频偏 = 0x19,
            [Description("设置标准设备同步时钟与补偿频偏成功 HW->PC")]
            设置标准设备同步时钟与补偿频偏成功 = 0x20,
            [Description("设置强制回复特殊的ACK的设备TEI信息 PC->HW")]
            设置强制回复特殊的ACK的设备TEI信息 = 0x21,
            [Description("设置强制回复特殊ACK成功 HW->PC")]
            设置强制回复特殊ACK成功 = 0x22,
            [Description("进入特定物理信道收发模式 PC->HW")]
            进入特定物理信道收发模式 = 0x23,
            [Description("设置进入特定物理信道成功 HW->PC")]
            设置进入特定物理信道成功 = 0x24,
            [Description("RF信道切换 PC->HW")]
            RF信道切换 = 0x25,
            [Description("设置切换指定信道成功 HW->PC")]
            设置切换指定信道成功 = 0x26,
        }

        public byte control1 { get; set; }
        public byte control2 { get; set; }
        public byte[] data { get; set; }
        
        public ClsProtol() {

        }


        public void setControl(string control, int place)
        {
            try
            {
                control = control.Replace(" ", "");

                byte hex = Convert.ToByte(control, 16);

                if (place == 1)
                {
                    this.control1 = hex;
                }
                else
                {
                    this.control2 = hex;
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void setControl(byte control,int place)
        {
            if(place == 1)
            {
                this.control1 = control;

            }
            else if(place == 2)
            {
                this.control2 = control;
            }
        }

        public bool setData(string value)
        {
            try
            {                                
                value = value.Replace(" ","").Replace("\n","").Replace("\r","");
                this.data = new byte[value.Length / 2];
                for (int i = 0; i < value.Length; i++)
                {
                    string hexByte = value.Substring(i * 2, 2);
                    this.data[i] = Convert.ToByte(hexByte, 16);
                }
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        public byte[] getLength()
        {
            
            int len = 4 ;
            if(this.data != null) {
                len += this.data.Length;
            }
            byte[] length = BitConverter.GetBytes(len);
            return length;
        }

        public byte getCRC() 
        {
            return 0xFF;
        }

        public string getString()
        {
            List<byte> bytes = getValue();
            
            return BitConverter.ToString(bytes.ToArray()).Replace("-"," ");
        }

        public List<byte> getValue( )
        {
            List<byte> values = new List<byte>();
            // 起始符
            values.Add(_start);
            // 帧长
            if(getLength() != null)
            {
                values.Add(getLength()[0]);
                values.Add(getLength()[1]);
            }
            
            // 控制域1
            values.Add(control1);

            // 控制域2
            values.Add(control2);

            // 数据域起始符
            values.Add(_datastart);
            // 数据域
            if(data != null)
            {
                for (int i = 0; i < data.Length; i++)
                {
                    values.Add(this.data[i]);
                }
            }
            

            // 校验
            values.Add(getCRC());
            // 结束符
            values.Add(_end);

            return values;
        }
    }
}
